#include "link_list.h"

// 单链表的创建
Link_list* init_link_list(void)
{
    // 1 创建 头节点的动态空间
    Link_list * list = (Link_list *)malloc(sizeof(Link_list));
    if (NULL == list)
    {
        printf("创建失败\n");
        return NULL;
    }
    
    list->next = NULL;

    return list;
}


// 单链表的销毁
void free_link_list(Link_list ** list)
{
    if (NULL == *list)
    {
        printf("链表 为 NULL\n");
        return ;
    }

    // 1 销毁结点
    Node * ptr_1 = (*list)->next;
    Node * ptr_2 = ptr_1->next;
    for (size_t i = 0; ptr_1 != NULL; i++)
    {
        free(ptr_1);
        // if 判断  判断 ptr2 = NULL 的时候 我们如何处理
        ptr_1 = ptr_2;
        if (NULL != ptr_2)
        {
            ptr_2 = ptr_2->next;
        }
        
    }
    // 2 销毁头结点
    free(*list);
    *list = NULL;
}

// 链表的插入操作
void insert_node(Link_list* list, Elenemt_data data, int pos) {
    // 创建新节点，并将数据写入到节点中
    Node* new_node = (Node*)malloc(sizeof(Node));
    if (new_node == NULL) {
        printf("创建新节点失败\n");
        return;
    }
    new_node->data = data;
    new_node->next = NULL;

    // 判断是否为第一个元素或者链表为空
    if (pos==1 || list->next == NULL) {
        // 如果是在头部，则将新节点的指针指向当前头节点，再将头节点指向新节点
        new_node->next = list->next;
        list->next = new_node;
        return;
    }

    // 开始遍历，找到要插入位置的前一个元素
    Node* current = list->next;
    for (int i = 1; i < pos - 1 && current != NULL; i++) {
        current = current->next; // 遍历下一个节点
    }

    // 已经遍历到NULL位置，即位置越界
    if (current == NULL) {
        printf("插入位置越界\n");
        free(new_node); // 释放新节点的内存
        return;
    }

    // 将新节点的next指针指向原插入位置的节点，将前一个节点的next指针指向新节点
    new_node->next = current->next;
    current->next = new_node;
}
//链表的删除
void delete_node(Link_list* list, int pos){
     // 安全检查
    if (list == NULL) {
        printf("链表不存在\n");
        return;
    }

// 任意位置删除
    // 创建两个节点指针 p 和 q，p指向要删除节点的前一个节点，q指向要删除的节点
    Node* p = list->next;
    Node* q = NULL;
    if (pos==1)
    {
        list->next=p->next;
        free(p);
        return;
    }
    
    // 遍历链表，找到要删除节点的前一个节点 p
    for (int i = 1; i < pos - 1 && p != NULL; i++) {
        p = p->next;
    }

    // 如果找不到要删除的节点，或者要删除的节点已经是最后一个节点，则提示错误并返回
    if (p == NULL || p->next == NULL) {
        printf("要删除的节点不存在\n");
        return;
    }

    q = p->next; // 将 q 指向要删除的节点
    p->next = q->next; // 将 p 的 next 指针指向 q 的下一个节点
    free(q); // 释放要删除的节点的内存空间
    return ;
}
//遍历链表
void print_link_list(Link_list* L){
    Node *ptr=L->next;
    for (size_t i = 0; ptr != NULL; i++)
    {
        printf("姓名:%s 性别:%s 年龄:%d 成绩:%d 学号:%d\n",
            ptr->data.name , ptr->data.sex , ptr->data.age , 
            ptr->data.sco  , ptr->data.id 
            );
        ptr = ptr->next;
    }
}
//按索引查找链表
Node* find_node_id(Link_list* list, int index){
    if (NULL==list)
    {
        printf("链表为空\n");
        return NULL;
    }
    if (NULL==list->next)
    {
        printf("表为无数据\n");
        return NULL;
    }
    Node *ptr=list->next;
    for (size_t i = 1; i < index; i++)
    {
        ptr=ptr->next;
    }
    return ptr;
}
//合并两个链表
Link_list* merge_link_lists(Link_list* list1, Link_list* list2){
    if (NULL==list1||NULL==list2)
    {
        printf("表为NULL\n");
        return NULL;
    }
    if (NULL==list1->next&&NULL==list2->next)
    {
        printf("俩个表内没有数据\n");
        return NULL;
    }
    
    Link_list *L3=init_link_list();
    Node *ptr1=list1->next;
    size_t i =0 ;
    for (size_t i = 1; ptr1!=NULL; i++)
    {   
        insert_node(L3,ptr1->data,i);
        ptr1=ptr1->next;
    }
    ptr1=list2->next;
    for (; NULL!=ptr1; i++)
    {
        insert_node(L3,ptr1->data,i);
        ptr1=ptr1->next;
    }
    return L3;
}
